package org.jeecg.modules.xxgx.common.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.apiacl.entity.TaxApiaclAuthorize;
import org.jeecg.modules.apiacl.service.ITaxApiaclAuthorizeService;
import org.jeecg.modules.common.util.LoginUserUtil;
import org.jeecg.modules.innerApi.bwgfApi.service.IBaiWangSkfpService;
import org.jeecg.modules.innerApi.common.requestDto.GetFwqxxParam;
import org.jeecg.modules.innerApi.common.responseDto.ZnfmRtn;
import org.jeecg.modules.innerApi.zhiYunApi.responseVo.ZyFwqxxNodeRtn;
import org.jeecg.modules.innerApi.zhiYunApi.service.IZhiyunSkfpService;
import org.jeecg.modules.xxgx.common.service.IXxBase;
import org.jeecg.modules.xxgx.common.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
* @Description: 销项基础管理
* @Author: jeecg-boot
* @Date:   2023-08-02
* @Version: V1.0
*/
@Api(tags="销项基础管理")
@RestController
@RequestMapping("/xxgx/common")
@Slf4j
public class TaxXxgxCommonController extends JeecgController<TaxApiaclAuthorize, ITaxApiaclAuthorizeService> {
    @Autowired
    IBaiWangSkfpService baiWangSkfpService;

    @Autowired
    private IZhiyunSkfpService zhiyunSkfpService;

    @Autowired
    private IXxBase xxBase;

    @Autowired
    private RedisUtil redisUtil;
   /**
     * 销项-智能赋码接口
     * @param xxApiZnfmParam
     * @param
     * @return
     */
    @AutoLog(value = "销项基础管理-智能赋码")
    @ApiOperation(value="销项基础管理-智能赋码", notes="销项基础管理-智能赋码")
    @PostMapping(value = "/znfm")
    public Result<List<ZnfmRtn>> znfm(@RequestBody XxApiZnfmParam xxApiZnfmParam) {
        String spmc=xxApiZnfmParam.getSpmc();
        log.info(xxApiZnfmParam.toString());
        List<ZnfmRtn> resAry=null;
        Result result=null;
        resAry = xxBase.znfm(spmc).getResult();
        if(resAry!=null){
            result= Result.OK("智能赋码成功",resAry);
        }else{
            result= Result.error("智能赋码失败");
        }
        return result;
    }
    /**
     * 销项-智能赋码接口
     * @param
     * @param
     * @return
     */
    @AutoLog(value = "销项基础管理-批量智能赋码")
    @ApiOperation(value="销项基础管理-批量智能赋码", notes="销项基础管理-批量智能赋码")
    @PostMapping(value = "/znfmBatch")
    public Result<List<ZnfmBatchVo>> znfmBatch(
            @ApiParam(value = "商品名称数组", required = true)
            @RequestBody List<String> spmcs) {
        List<ZnfmBatchVo> rtnList = new ArrayList<>();

        List<ZnfmRtn> znfmList = null;
        for(String spmc : spmcs) {
            ZnfmBatchVo znfmBatchVo = new ZnfmBatchVo();
            znfmBatchVo.setSpmc(spmc);
            znfmList = xxBase.znfm(spmc).getResult();
            znfmBatchVo.setFmjg(znfmList);

            if(znfmList!=null){
                rtnList.add(znfmBatchVo);
            }
        }
        return Result.OK("智能赋码成功",rtnList);
    }

    /**
     * 销项-云抬头检索接口
     * @param searchParam
     * @param
     * @return
     */
    @AutoLog(value = "销项基础管理-云抬头检索")
    @ApiOperation(value="销项基础管理-云抬头检索", notes="销项基础管理-云抬头检索")
    @PostMapping(value = "/comSearch")
    public Result<JSONArray> comSearch(@RequestBody XxApiComSearchParam searchParam) {
        String searchName=searchParam.getSearchName();
        return xxBase.comSearch(searchName);
    }

    /**
     * 销项-获取服务器信息接口
     * @param getFwqxxParam
     * @param
     * @return
     */
    @AutoLog(value = "销项基础管理-获取服务器信息")
    @ApiOperation(value="销项基础管理-获取服务器信息", notes="销项基础管理-获取服务器信息")
    @PostMapping(value = "/getFwqxx")
    public Result<JSONObject> getFwqxx(@RequestBody GetFwqxxParam getFwqxxParam) {
        log.info(getFwqxxParam.toString());
        Result result=null;
        ZyFwqxxNodeRtn fwqxx=zhiyunSkfpService.getFwqxx(getFwqxxParam);
        if(fwqxx!=null){
            result= Result.OK("获取服务器信息成功",fwqxx);
        }else{
            result= Result.error("获取服务器信息失败");
        }
        return result;
    }

    @AutoLog(value = "销项基础管理-获取用户开票场景设置")
    @ApiOperation(value="销项基础管理-获取用户开票场景设置", notes="销项基础管理-获取用户开票场景设置")
    @PostMapping(value = "/getkpcj")
    public Result<XxZdyKpcjVo> getkpcj() {
        LoginUser user = LoginUserUtil.getLoginUser();
        XxZdyKpcjVo xxZdyKpcjVo ;
        String userKpcj = (String) redisUtil.get("XX_KPCJ_" + user.getId());
        if(StringUtils.isEmpty(userKpcj)){
            xxZdyKpcjVo = getDefaultKpcj();
        } else {
            xxZdyKpcjVo = JSON.parseObject(userKpcj,XxZdyKpcjVo.class);
        }
        return Result.OK(xxZdyKpcjVo);
    }

    @AutoLog(value = "销项基础管理-保存用户开票场景")
    @ApiOperation(value="销项基础管理-保存用户开票场景", notes="销项基础管理-保存用户开票场景")
    @PostMapping(value = "/setkpcj")
    public Result setkpcj(@RequestBody XxZdyKpcjVo xxZdyKpcjVo) {
        LoginUser user = LoginUserUtil.getLoginUser();
        redisUtil.set("XX_KPCJ_" + user.getId(), JSON.toJSONString(xxZdyKpcjVo));
        return Result.OK("设置成功");
    }

    /**
     * 开票场景默认设置
     * @return
     */
    private XxZdyKpcjVo getDefaultKpcj(){
        XxZdyKpcjVo xxZdyKpcjVo = new XxZdyKpcjVo();
        //数电票开具场景
        List<XxZdyKpcjItemVo> sdKpcjList = new ArrayList<>();
        XxZdyKpcjItemVo xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("sdp_dzfp");
        xxZdyKpcjItemVo.setName("数电票-电子发票");
        xxZdyKpcjItemVo.setSelected(true);
        sdKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("sdp_zzfp");
        xxZdyKpcjItemVo.setName("数电票-纸质发票");
        xxZdyKpcjItemVo.setSelected(true);
        sdKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjVo.setSdpkjcj(sdKpcjList);

        //税控票开具场景
        List<XxZdyKpcjItemVo> skKpcjList = new ArrayList<>();

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_zp");
        xxZdyKpcjItemVo.setName("专票");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_zpjdc");
        xxZdyKpcjItemVo.setName("专票（机动车）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_zpcpy");
        xxZdyKpcjItemVo.setName("专票（成品油）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_dzzp");
        xxZdyKpcjItemVo.setName("电子专票");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_pp");
        xxZdyKpcjItemVo.setName("普票");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_ppsg");
        xxZdyKpcjItemVo.setName("普票（收购）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_ppcpy");
        xxZdyKpcjItemVo.setName("普票（成品油）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_jpcpy");
        xxZdyKpcjItemVo.setName("卷票（成品油）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_dzpp");
        xxZdyKpcjItemVo.setName("电子普票");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_dzppsg");
        xxZdyKpcjItemVo.setName("电子普票（收购）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_dzppcpy");
        xxZdyKpcjItemVo.setName("电子普票（成品油）");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_jp");
        xxZdyKpcjItemVo.setName("卷票");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjItemVo = new XxZdyKpcjItemVo();
        xxZdyKpcjItemVo.setCode("skp_jdc");
        xxZdyKpcjItemVo.setName("机动车");
        xxZdyKpcjItemVo.setSelected(true);
        skKpcjList.add(xxZdyKpcjItemVo);

        xxZdyKpcjVo.setSkpkjcj(skKpcjList);

        return xxZdyKpcjVo;
    }

}
